package com.example.core;

import org.springframework.stereotype.Component;

/**
 * SQL生成器
 */
@Component
public class SqlGenerator {
    
    /**
     * 生成建表SQL
     */
    public String generateCreateTableSql(TableInfo tableInfo) {
        StringBuilder sql = new StringBuilder();
        sql.append("CREATE TABLE IF NOT EXISTS `").append(tableInfo.getTableName()).append("` (\n");
        
        // 添加字段
        for (int i = 0; i < tableInfo.getColumns().size(); i++) {
            TableInfo.ColumnInfo column = tableInfo.getColumns().get(i);
            sql.append("  `").append(column.getColumnName()).append("` ");
            sql.append(formatColumnType(column));
            
            // 主键
            if (column.getPrimaryKey()) {
                sql.append(" PRIMARY KEY");
            }
            
            // 自增
            if (column.getAutoIncrement()) {
                sql.append(" AUTO_INCREMENT");
            }
            
            // 非空
            if (!column.getNullable()) {
                sql.append(" NOT NULL");
            }
            
            // 默认值
            if (column.getDefaultValue() != null && !column.getDefaultValue().isEmpty()) {
                sql.append(" DEFAULT ").append(formatDefaultValue(column));
            }
            
            // 注释
            if (column.getComment() != null && !column.getComment().isEmpty()) {
                sql.append(" COMMENT '").append(column.getComment()).append("'");
            }
            
            if (i < tableInfo.getColumns().size() - 1) {
                sql.append(",\n");
            }
        }
        
        sql.append("\n)");
        
        // 表注释
        if (tableInfo.getComment() != null && !tableInfo.getComment().isEmpty()) {
            sql.append(" COMMENT='").append(tableInfo.getComment()).append("'");
        }
        
        sql.append(";");
        
        return sql.toString();
    }
    
    /**
     * 生成创建索引SQL
     * 注意：MySQL不支持CREATE INDEX IF NOT EXISTS语法，需要在调用前检查索引是否存在
     */
    public String generateCreateIndexSql(String tableName, TableInfo.IndexInfo indexInfo) {
        StringBuilder sql = new StringBuilder();
        
        if (indexInfo.getUnique()) {
            sql.append("CREATE UNIQUE INDEX ");
        } else {
            sql.append("CREATE INDEX ");
        }
        
        sql.append("`").append(indexInfo.getIndexName()).append("` ON `")
           .append(tableName).append("` (`")
           .append(indexInfo.getColumnName()).append("`);");
        
        return sql.toString();
    }
    
    /**
     * 生成检查索引是否存在的SQL
     */
    public String generateCheckIndexExistsSql(String tableName, String indexName) {
        return "SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS " +
               "WHERE TABLE_SCHEMA = DATABASE() " +
               "AND TABLE_NAME = '" + tableName + "' " +
               "AND INDEX_NAME = '" + indexName + "'";
    }
    
    /**
     * 生成删除表SQL
     */
    public String generateDropTableSql(String tableName) {
        return "DROP TABLE IF EXISTS `" + tableName + "`;";
    }
    
    /**
     * 生成检查表是否存在的SQL
     */
    public String generateCheckTableExistsSql(String tableName) {
        return "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '" + tableName + "'";
    }
    
    /**
     * 生成添加列的SQL
     */
    public String generateAddColumnSql(String tableName, TableInfo.ColumnInfo column) {
        StringBuilder sql = new StringBuilder();
        sql.append("ALTER TABLE `").append(tableName).append("` ADD COLUMN `")
           .append(column.getColumnName()).append("` ");
        sql.append(formatColumnType(column));
        
        // 非空
        if (!column.getNullable()) {
            sql.append(" NOT NULL");
        }
        
        // 默认值
        if (column.getDefaultValue() != null && !column.getDefaultValue().isEmpty()) {
            sql.append(" DEFAULT ").append(formatDefaultValue(column));
        }
        
        // 注释
        if (column.getComment() != null && !column.getComment().isEmpty()) {
            sql.append(" COMMENT '").append(column.getComment()).append("'");
        }
        
        sql.append(";");
        return sql.toString();
    }
    
    /**
     * 生成删除列的SQL
     */
    public String generateDropColumnSql(String tableName, String columnName) {
        return "ALTER TABLE `" + tableName + "` DROP COLUMN `" + columnName + "`;";
    }
    
    /**
     * 生成修改列的SQL
     */
    public String generateModifyColumnSql(String tableName, TableInfo.ColumnInfo column) {
        StringBuilder sql = new StringBuilder();
        sql.append("ALTER TABLE `").append(tableName).append("` MODIFY COLUMN `")
           .append(column.getColumnName()).append("` ");
        sql.append(formatColumnType(column));
        
        // 非空
        if (!column.getNullable()) {
            sql.append(" NOT NULL");
        }
        
        // 自增（必须在 NOT NULL 之后，DEFAULT 之前）
        if (column.getAutoIncrement() != null && column.getAutoIncrement()) {
            sql.append(" AUTO_INCREMENT");
        }
        
        // 默认值
        if (column.getDefaultValue() != null && !column.getDefaultValue().isEmpty()) {
            sql.append(" DEFAULT ").append(formatDefaultValue(column));
        }
        
        // 注释
        if (column.getComment() != null && !column.getComment().isEmpty()) {
            sql.append(" COMMENT '").append(column.getComment()).append("'");
        }
        
        sql.append(";");
        return sql.toString();
    }
    
    /**
     * 格式化字段类型
     */
    private String formatColumnType(TableInfo.ColumnInfo column) {
        String type = column.getColumnType().toUpperCase();
        
        // 处理带长度的类型
        if (type.contains("(")) {
            return type;
        }
        
        // 需要长度的类型
        if (type.equals("VARCHAR") || type.equals("CHAR")) {
            return type + "(" + column.getLength() + ")";
        }
        
        // DECIMAL类型
        if (type.equals("DECIMAL")) {
            return type + "(" + column.getLength() + "," + column.getScale() + ")";
        }
        
        return type;
    }
    
    /**
     * 格式化默认值
     */
    private String formatDefaultValue(TableInfo.ColumnInfo column) {
        String defaultValue = column.getDefaultValue();
        String type = column.getColumnType().toUpperCase();
        
        // 数字类型不需要引号
        if (type.contains("INT") || type.contains("DECIMAL") || 
            type.contains("FLOAT") || type.contains("DOUBLE")) {
            return defaultValue;
        }
        
        // 字符串类型需要引号
        return "'" + defaultValue + "'";
    }
}
